package com.jelly.common.util.web;

import com.jelly.common.util.ListUtil;
import com.jelly.common.web.tree.Tree;

import java.util.*;

/**
 * @创建人 ql
 * @创建时间 2018-08-08 13:31
 * @功能描述: list解析树形结构工具
 **/
public class BuildTreeUtil {

    public static <T> Tree<T> build(List<Tree<T>> nodes) {

        if (nodes == null) {
            return null;
        }
        List<Tree<T>> topNodes = new ArrayList<Tree<T>>();

        for (Tree<T> children : nodes) {

            String pid = children.getParentId();
            if (pid == null || "0".equals(pid)) {
                topNodes.add(children);

                continue;
            }

            for (Tree<T> parent : nodes) {
                String id = parent.getId();
                if (id != null && id.equals(pid)) {
                    parent.getChildren().add(children);
                    children.setHasParent(true);
                    parent.setChildren(true);
                    continue;
                }
            }

        }

        Tree<T> root = new Tree<T>();
        if (topNodes.size() == 1) {
            root = topNodes.get(0);
        } else {
            root.setId("0");
            root.setParentId("");
            root.setHasParent(false);
            root.setChildren(true);
            root.setChecked(true);
            root.setChildren(topNodes);
            root.setText("顶级节点");
            Map<String, Object> state = new HashMap<>();
            state.put("opened", true);
            root.setState(state);
        }

        return root;
    }

    public static <T> List<Tree<T>> buildList(List<Tree<T>> nodes, String idParam) {
        if (nodes == null) {
            return null;
        }
        List<Tree<T>> topNodes = new ArrayList<Tree<T>>();

        for (Tree<T> children : nodes) {

            String pid = children.getParentId();
            if (pid == null || idParam.equals(pid)) {
                topNodes.add(children);

                continue;
            }

            for (Tree<T> parent : nodes) {
                String id = parent.getId();
                if (id != null && id.equals(pid)) {
                    parent.getChildren().add(children);
                    children.setHasParent(true);
                    parent.setChildren(true);

                    continue;
                }
            }

        }
        return topNodes;
    }



    public static <T> List<String> builds(List<Tree<T>> nodes,String value) {
        List<String> list =  new LinkedList<>();

        for (Tree<T> children : nodes) {

            if(ListUtil.isNotList(children.getChildren())){

                for (Tree<T> childrens : children.getChildren()){

                    if(ListUtil.isNotList(childrens.getChildren())){

                        for (Tree<T> childrensss : childrens.getChildren()){

                            if(childrensss.getId().equals(value)){
                                list.add(children.getId());
                                list.add(childrens.getId());
                                list.add(value);
                                return list;
                            }

                        }

                    }
                    if(childrens.getId().equals(value)){
                        list.add(children.getId());
                        list.add(childrens.getId());
                        return list;
                    }

                }

            }
            if(children.getId().equals(value)){
                list.add(children.getId());
                return list;
            }

        }

        return list;
    }
}
